home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Very Best of Atari Inside
/
The Very Best of Atari Inside 1.iso
/
mint
/
mfs055
/
minixfs.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-12
|
11KB
|
285 lines
#ifndef minixfs_h
#define minixfs_h
#define SIZEOF sizeof
/* General types we will use */
typedef unsigned short unshort;
typedef unsigned short ushort;
typedef unshort mino_t;
typedef unshort muid_t;
typedef unsigned char mgid_t;
typedef unsigned char nlink_t;
typedef unshort mode_t;
typedef unshort zone_nr;
/* User settable parameters */
/*#define MFS_NMOVE_DIR*/ /* no movement of directories (rename OK) */
/*#define LRDEBUG*/ /* debug lrecno */
/*#define BIGDIRTEST*/ /* debug big dir code */
#define SCACHE_SIZE 20 /* # blocks in built in system cache */
#define UCACHE_SIZE 20 /* # blocks in built in user cache */
#define NUM_MINIX 10 /* absolute maximum # of minix partitions */
#define WRITETHRU /* write thru mode */
#define ROBUST /* Sync periodically on write */
#define MAX_INCREMENT 2 /* Determines max filename length,see below */
/* Constants for fscntl */
#define MFS_BASE 0x100
#define MFS_VERIFY (MFS_BASE) /* Return minixfs magic number */
#define MFS_SYNC (MFS_BASE|0x01) /* Sync the filesystem */
#define MFS_CINVALID (MFS_BASE|0x02) /* Invalidate cache entries */
#define MFS_FINVALID (MFS_BASE|0x03) /* Invalidate Fileptrs */
#define MFS_INFO (MFS_BASE|0x04) /* Get info about filesystem */
#define MFS_USAGE (MFS_BASE|0x05) /* Get block allocation of a file */
#define MFS_IMODE (MFS_BASE|0x06) /* Change all bits in an inode mode */
#define MFS_GTRANS (MFS_BASE|0x07) /* Get filename translation mode */
#define MFS_STRANS (MFS_BASE|0x08) /* Set filename translation mode */
#define MFS_MAGIC 0x18970431 /* Magic number from MFS_VERIFY */
/* Filename translation modes */
#define SRCH_TOS 0x01 /* search with tosify , tos domain */
#define SRCH_MNT 0x02 /* search with tosify , mint domain */
#define DIR_TOS 0x04 /* dir compat tosify , tos domain */
#define DIR_MNT 0x08 /* dir compat tosify , mint domain */
#define LWR_TOS 0x10 /* lower case creat , tos domain */
#define LWR_MNT 0x20 /* lower case creat , mint domain */
#define AEXEC_TOS 0x40 /* auto 'x' , tos domain. */
#define AEXEC_MNT 0x80 /* auto 'x' , mint domain. */
/* Default translation modes ... change if desired */
#define TRANS_DEFAULT (SRCH_TOS | DIR_TOS | DIR_MNT | LWR_TOS | AEXEC_TOS )
typedef struct {
long total_inodes,total_zones;
long free_inodes,free_zones;
int version; /* Filesystem version 1=V1 2=V2 */
int increment; /* Directory increment */
long res1,res2,res3,res4; /* Reserved for future use */
} mfs_info;
/* Macro to determine maximum filename length for a given increment */
#define MMAX_FNAME(x) ( ( (x)<<4 ) -2)
/* Absolute maximum filename length */
#define MNAME_MAX MMAX_FNAME(MAX_INCREMENT)
/* Set this to be true if 'c' is an illegal character for a filename */
#define BADCHR(c) (c=='/')
/* Some unixes have something a bit stricter,uncomment out this if required */
/* #define BADCHR(c) ( (c=='/') || (c & 0x80) ) */
/* (or supply your own ) */
#define SYMLINK_NAME_MAX 127 /* Maximum size of symlink name */
#define MINIX_MAX_LINK 127 /* Max links to an inode *MUST* be < 256 */
#define BLOCK_SIZE 1024 /* # bytes in a disk block */
#define MAJOR 8 /* major device = (dev>>MAJOR) & 0377 */
#define MINOR 0 /* minor device = (dev>>MINOR) & 0377 */
#define NOLAST (mino_t *) 0 /* We dont want parent directory of a file */
/* Flag bits for i_mode in the inode. */
#define I_SYMLINK 0160000 /* symbolic link (not standard minix) */
#define I_TYPE 0170000 /* this field gives inode type */
#define I_REGULAR 0100000 /* regular file, not dir or special */
#define I_BLOCK_SPECIAL 0060000 /* block special file */
#define I_DIRECTORY 0040000 /* file is a directory */
#define I_CHAR_SPECIAL 0020000 /* character special file */
#define I_NAMED_PIPE 0010000 /* named pipe (FIFO) */
#define I_SET_UID_BIT 0004000 /* set effective uid_t on exec */
#define I_SET_GID_BIT 0002000 /* set effective gid_t on exec */
#define I_STICKY 0001000 /* sticky bit */
#define ALL_MODES 0007777 /* all bits for user, group and others */
#define RWX_MODES 0000777 /* mode bits for RWX only */
#define R_BIT 0000004 /* Rwx protection bit */
#define W_BIT 0000002 /* rWx protection bit */
#define X_BIT 0000001 /* rwX protection bit */
#define I_NOT_ALLOC 0000000 /* this inode is free */
/* Useful macros */
#define IS_DIR(m) ((m.i_mode & I_TYPE)==I_DIRECTORY)
#define IS_REG(m) ((m.i_mode & I_TYPE)==I_REGULAR)
/* Flag bits for cookie 'aux' field */
#define AUX_DEL 1 /* file marked for deletion */
#define AUX_SYNC 2 /* l_sync() on next write */
/* Tables sizes */
#define NR_ZONE_NUMS 9 /* # zone numbers in an inode */
#define NR_ZONE_NUMS2 10 /* #zone numbers in v2 inode */
/* Miscellaneous constants */
#define SUPER_MAGIC 0x137F /* magic number contained in super-block */
#define SUPER_V2 0x2468 /* v2 magic number */
#define FIND 0 /* tells search_dir to search for file */
#define ADD 1 /* tells search_dir to add a dir entry */
#define KILL 2 /* tells search_dir to kill entry */
#define POS 3 /* tells search_dir to find position */
#define INVALID 0 /* Cache entry is garbage */
#define CLEAN 1 /* Cache entry same as disk */
#define DIRTY 2 /* Cache entry is more recent than disk */
#define BOOT_BLOCK 0 /* block number of boot block */
#define SUPER_BLOCK 1 /* block number of super block */
#define ROOT_INODE (mino_t)1 /* inode number for root directory */
/* Derived sizes */
#define ZONE_NUM_SIZE (SIZEOF(zone_nr)) /* # bytes in zone nr */
#define NR_DZONE_NUM (NR_ZONE_NUMS-2) /* # zones in inode */
#define DIR_ENTRY_SIZE (SIZEOF(dir_struct)) /* # bytes/dir entry */
#define INODES_PER_BLOCK (BLOCK_SIZE/INODE_SIZE) /* # inodes/disk blk */
#define INODE_SIZE (SIZEOF(d_inode1)) /* bytes in disk inode */
#define NR_DIR_ENTRIES (BLOCK_SIZE/DIR_ENTRY_SIZE) /* # dir entries/block */
#define NR_INDIRECTS (BLOCK_SIZE/ZONE_NUM_SIZE) /* # zones/indir block */
#define NR_DBL (NR_DZONE_NUM+NR_INDIRECTS) /* 1st zone in dbl ind */
#define INTS_PER_BLOCK (BLOCK_SIZE/SIZEOF(int)) /* # integers/block */
#define SUPER_SIZE (SIZEOF(struct super_block)) /* super_block size */
#define PIPE_SIZE (NR_DZONE_NUM*BLOCK_SIZE) /* pipe size in bytes */
#define MAX_ZONES (NR_DZONE_NUM+NR_INDIRECTS+(long)NR_INDIRECTS*NR_INDIRECTS)
#define NR_ZONE_NUMS2 10
#define NR_DZONE_NUM2 (NR_ZONE_NUMS2-3)
#define ZONE_NUM_SIZE2 (SIZEOF(long))
#define INODES_PER_BLOCK2 (BLOCK_SIZE/INODE_SIZE2)
#define INODE_SIZE2 (SIZEOF(d_inode))
#define NR_INDIRECTS2 (BLOCK_SIZE/ZONE_NUM_SIZE2)
#define NR_DBL2 (NR_DZONE_NUM2+NR_INDIRECTS2)
#ifndef SEEK_SET
/* lseek() origins */
#define SEEK_SET 0 /* from beginning of file */
#define SEEK_CUR 1 /* from current location */
#define SEEK_END 2 /* from end of file */
#endif
#ifndef min
#define min(a,b) ((a)>(b) ? (b) : (a))
#endif
typedef struct {
mino_t s_ninodes; /* # usable inodes on the minor device */
zone_nr s_nzones; /* total device size, including bit maps etc */
unshort s_imap_blks; /* # of blocks used by inode bit map */
unshort s_zmap_blks; /* # of blocks used by zone bit map */
zone_nr s_firstdatazn; /* number of first data zone */
short int s_log_zsize; /* log2 of blocks/zone */
off_t s_max_size; /* maximum file size on this device */
short s_magic; /* magic number to recognize super-blocks */
short pad; /* padding */
long s_zones; /* long version of s_nzones for v2 */
} super_block;
/* super_info contains information about each Minix filesystem */
typedef struct {
super_block sblk; /* Actual super block */
int scsiz; /* sector size/512 */
int dev; /* Device this belongs to */
long serialno; /* Serial number of disk (ignored for now)*/
long ioff; /* Offset to inode 1 */
ushort *ibitmap;
ushort idirty; /* Set if ibitmap changed after last write */
ushort *zbitmap;
ushort zdirty; /* zbitmap dirty flag */
long zlast; /* search start for free zones */
/* This lot is filled in as appropriate for each FS type */
char version; /* 0 for V1, 1 for V2 */
char big; /* Use lrecno for this partition */
unsigned ipb; /* Inodes per block */
unsigned zpind; /* zones per indirection block */
unsigned dzpi; /* direct zones per inode */
unsigned ndbl; /* first zone number in double indirect block */
int increment; /* num of dir_structs per dir entry */
} super_info;
/* This is what a directory entry on the disk looks like. Note: we can use
* a dirty trick to use this same structure for large filenames > 14 chars
* the idea is to use only a fraction of the total entries , so that if
* say the filename size is 30 we just use entries 0,2,4,6,8 etc. d_name
* then occupies all of the next entry. This forces the max filename size
* to be 2 less than a power of two (and certainly less than 1022), normally
* 30 should be more than adequate to cover every filename you'll ever see.
* 62 is for paranoids , but remember the path name limit of 128 characters.
*/
typedef struct { /* directory entry */
mino_t d_inum; /* inode number */
char d_name[MMAX_FNAME(1)]; /* character string */
} dir_struct;
typedef struct { /* disk inode. */
mode_t i_mode; /* file type, protection, etc. */
muid_t i_uid; /* user id of the file's owner */
off_t i_size; /* current file size in bytes */
time_t i_mtime; /* when was file data last changed */
mgid_t i_gid; /* group number */
nlink_t i_nlinks; /* how many links to this file */
zone_nr i_zone[NR_ZONE_NUMS]; /* block nums for direct, ind, and dbl ind */
} d_inode1;
typedef struct { /* V2.x disk inode */
ushort i_mode; /* file type, protection, etc. */
ushort i_nlinks; /* how many links to this file. HACK! */
ushort i_uid; /* user id of the file's owner. */
ushort i_gid; /* group number HACK! */
off_t i_size; /* current file size in bytes */
time_t i_atime; /* when was file data last accessed */
time_t i_mtime; /* when was file data last changed */
time_t i_ctime; /* when was inode data last changed */
long i_zone[NR_ZONE_NUMS2]; /* block nums for direct, ind, and dbl ind */
} d_inode;
typedef
union {
char bdata[BLOCK_SIZE]; /* ordinary user data */
dir_struct bdir[NR_DIR_ENTRIES]; /* directory block */
zone_nr bind1[NR_INDIRECTS]; /* indirect block */
long bind[NR_INDIRECTS2]; /* v2 indirect block */
d_inode1 binode1[INODES_PER_BLOCK]; /* inode block */
d_inode binode[INODES_PER_BLOCK2]; /* v2 inode block */
short bsh[INTS_PER_BLOCK]; /* block full of shorts */
} bufr;
typedef struct {
bufr buffer;
long block; /* Block number bufr contains */
short drive; /* Drive of bufr */
short status; /* 0=invalid , 1=valid&clean 2=dirty */
} cache;
typedef struct {
cache *pos,*start,*end;
} cache_control;
/* Macros for indirection blocks */
#define PIND(vers,tmp,index) \
( (vers) ? (tmp->bind[index]) : (tmp->bind1[index]) )
#define IND(vers,temp,index) \
( (vers) ? (temp.bind[index]) : (temp.bind1[index]) )
#endif